在 第18天 介紹過該如何透過 Drone
自動 Build Image
並推上 Harbor
私有庫,那麼今天介紹該如何透過Drone
更新線上環境的 Image
版本號。
首先在操作 Drone
更新 K8S
的 Image
版號前,必需先了解使用 K8S
達到滾動升級的三種方式
set image
## kubectl set image <deployment name> <container>=<image> --record
$ kubectl set image nginx-deploy nginx=nginx:v0.0.2 --record
replace
修改 deployment.yaml
的容器版本號後,執行 kubectl replace -f <filename>
edit
透過編輯視窗直接更改 yaml
檔案內容,存檔後立即生效。
## kubectl edit deployment <deployment name> --record
$ kubectl edit deployment nginx-deploy --record
注意:
--record
參數通知 k8s 把指令記錄起來以方便之後檢查
執行kubectl rollout history deployment <deployment name>
可以查看更新狀況[color=red]
以上這三種方式,第二種與第三種都是手動更改檔案,再透過指令的方式進行升版,且文件有可能發生更改錯誤,例如排版錯誤多了一個空白鍵,而第一種方式則是透過指令的方式進行升版,相對地比較單純,那麼了解了三種升版方式,看似第一種kubectl set
是最適合做為準動升級,只是每次更新程式都必需打指令更新蠻擾人的,那...不如交給 Drone
處理吧!
進入重頭戲,介紹一個 Drone Plugin
: Kubernetes Deployments,這一個 Plugin
就是負責協助維運人員執行 kubectl set image
的指令,只需要提供對應的 namespace
、deployment
、container name
以及相關驗證等資訊,接下來就交由自動化協助升級線上服務版本啦。
那們今天的目標就是除了讓 Drone
代替維運人員自動 Build Image
也需要協助維運人員自動更新線上程式本版,目標如以下流程圖。
先來複習一下第18天的 .drone.yaml
內容
## Drone 1.0 版本寫法
kind: pipeline
type: docker # 在 Docker 內部執行管道命令
name: clone # 可自行定義的名稱
steps:
- name: build-golang # 事件一:可自行定義的名稱
image: neil605164/plugin-govendor # 使用 neil605164/plugin-govendor 容器
commands: # 需執行的指令
- mkdir -p /usr/local/go/src/${DRONE_REPO_NAME} # 於 goroot 建立專案名稱的空資料夾
- ls -al vendor # 查看當前 vendor 資料夾(尚未編譯完成的 code)
- rsync -r /drone/src/* /usr/local/go/src/${DRONE_REPO_NAME} # 將 clone 的專案複製到 goroot 底下
- cd /usr/local/go/src/${DRONE_REPO_NAME} # 移動至 goroot 專案底下
- govendor sync # 編譯 golang 程式碼
- rsync -r /usr/local/go/src/${DRONE_REPO_NAME}/* /drone/src # 將編譯後的程式在複製回 drone 預設 path
- ls -al vendor # 查看當前 vendor 資料夾(已經編譯完成的 code)
- name: build-image-push-harbor # 事件二:可自行定義的名稱
image: plugins/docker # 使用 plugins/docker 容器
settings:
username: # harbor 私有庫帳號
from_secret: docker_username
password: # harbor 私有庫密碼
from_secret: docker_password
repo: <harbor url>/library/golang-hello # harbor 私有庫存放位置
tags: latest # harbor image tag( 也可以利用 ${DRONE_TAG} 自動取得 push 到 gitlab 的版號)
registry: <harbor url> # harbor 私有庫網址
從上面的 yaml
檔案可以看到有兩個事件需要執行:
接著如果需要自動更新線上版本,只需要再增加一個事件,如以下 yaml
內容:
- name: k8s-deploy # 事件三:可自行定義的名稱
image: quay.io/honestbee/drone-kubernetes # 使用 quay.io/honestbee/drone-kubernetes 容器
settings:
kubernetes_server: <K8S server url> # K8S master url
namespace: <namespace name> # 服務所屬的 namespace
deployment: <deployment name> # 服務所屬的 deployment
repo: <inmage repo path> # 服務所用的 image 來源
container: <container name> # 服務的 container 名稱
tag: latest-dev # 服務的新版板號,可替換成變數,ex: ${DRONE_TAG}
kubernetes_token: # K8S 驗證 token
from_secret: kubernetes_token
debug: true
以上就是今天的內容,開發人員只需要簡單的 git push
指令,就可以達到後續自動佈署,若需要區分環境,也可以加上 Drone
內鍵功能的 when.branch: master
等其他分支或者 tag 作為條件,過濾何時該執行特定事件。
yaml
檔案## Drone 1.0 版本寫法
kind: pipeline
type: docker # 在 Docker 內部執行管道命令
name: clone # 可自行定義的名稱
steps:
- name: build-golang # 事件一:可自行定義的名稱
image: neil605164/plugin-govendor # 使用 neil605164/plugin-govendor 容器
commands: # 需執行的指令
- mkdir -p /usr/local/go/src/${DRONE_REPO_NAME} # 於 goroot 建立專案名稱的空資料夾
- ls -al vendor # 查看當前 vendor 資料夾(尚未編譯完成的 code)
- rsync -r /drone/src/* /usr/local/go/src/${DRONE_REPO_NAME} # 將 clone 的專案複製到 goroot 底下
- cd /usr/local/go/src/${DRONE_REPO_NAME} # 移動至 goroot 專案底下
- govendor sync # 編譯 golang 程式碼
- rsync -r /usr/local/go/src/${DRONE_REPO_NAME}/* /drone/src # 將編譯後的程式在複製回 drone 預設 path
- ls -al vendor # 查看當前 vendor 資料夾(已經編譯完成的 code)
- name: build-image-push-harbor # 事件二:可自行定義的名稱
image: plugins/docker # 使用 plugins/docker 容器
settings:
username: # harbor 私有庫帳號
from_secret: docker_username
password: # harbor 私有庫密碼
from_secret: docker_password
repo: <harbor url>/library/golang-hello # harbor 私有庫存放位置
tags: latest # harbor image tag( 也可以利用 ${DRONE_TAG} 自動取得 push 到 gitlab 的版號)
registry: <harbor url>
- name: k8s-deploy # 事件三:可自行定義的名稱
image: quay.io/honestbee/drone-kubernetes # 使用 quay.io/honestbee/drone-kubernetes 容器
settings:
kubernetes_server: <K8S server url> # K8S master url
namespace: <namespace name> # 服務所屬的 namespace
deployment: <deployment name> # 服務所屬的 deployment
repo: <inmage repo path> # 服務所用的 image 來源
container: <container name> # 服務的 container 名稱
tag: latest-dev # 服務的新版板號,可替換成變數,ex: ${DRONE_TAG}
kubernetes_token: # K8S 驗證 token
from_secret: kubernetes_token
debug: true # 是否開啟 debug 模式(default is false)
注意:
.drone.yml
檔案內容的事件,若無指定平行處理,那麼會有順序性由上至下,在撰寫事件時需要注意Drone
內鍵可以使用的全域變數 參考文件